package demo06

import (
	"github.com/xuri/excelize/v2"
	"log"
)

// Go语言轻松搞定Excel的操作，简单生成图表
// https://juejin.cn/post/7381339338708451328?searchId=20241119152350E7FFD396F9872302CF04

func NewExcel01() {
	var err error
	// 新建文件
	file := excelize.NewFile()
	defer func() {
		err := file.Close()
		if err != nil {
			log.Fatalln("关闭文件异常: ", err)
		}
	}()
	//// 新建工作簿
	//_, err := file.NewSheet("diaomao")
	//if err != nil {
	//	log.Fatalln("创建工作表失败: ", err)
	//}
	// 保存文件
	err = file.SaveAs("test2.xlsx")
	if err != nil {
		log.Fatalln("保存文件异常: ", err)
	}
	log.Println("ok")
}

func OpenExcel01() {
	var err error
	// 新建文件
	file, err := excelize.OpenFile("test.xlsx")
	if err != nil {
		log.Fatalln("打开文件异常: ", err)
	}
	defer func() {
		err := file.Close()
		if err != nil {
			log.Fatalln("关闭文件异常: ", err)
		}
	}()
	// 新建工作簿
	_, err = file.NewSheet("diaomao2")
	if err != nil {
		log.Fatalln("创建工作表失败: ", err)
	}
	// 保存文件
	err = file.SaveAs("test.xlsx")
	if err != nil {
		log.Fatalln("保存文件异常: ", err)
	}
	log.Println("ok")
}

func WriteExcel01() {
	file, err := excelize.OpenFile("test.xlsx")
	if err != nil {
		log.Fatalln("打开文件异常: ", err)
	}
	defer func() {
		err := file.Close()
		if err != nil {
			log.Fatalln("关闭文件异常: ", err)
		}
	}()
	// 设置单元格值，参数1为工作表名，参数2为单元格，参数3为值
	//在代码中使用SetCell方法可以写入相应的值到表格中，常见SetCell方法如下：
	//SetCellStr：写入字符类型值
	//SetCellInt：写入整形值
	//SetCellBool：写入布尔类型值
	//SetCellFloat：写入浮点类型值
	_ = file.SetCellStr("diaomao", "A1", "姓名")
	_ = file.SetCellStr("diaomao", "A2", "年龄")
	// 保存文件
	err = file.Save()
	if err != nil {
		log.Fatalln("保存文件异常: ", err)
	}
	log.Println("write ok")
}

func ReadExcel01() {
	// 在读取单元格的时候使用GetCellValue方法，读取的时候没有类型区分，大部分使用这个方法即可。
	file, err := excelize.OpenFile("test.xlsx")
	if err != nil {
		log.Fatalln("打开文件异常: ", err)
	}
	defer func() {
		err := file.Close()
		if err != nil {
			log.Fatalln("关闭文件异常: ", err)
		}
	}()
	// 设置单元格值，参数1为工作表名，参数2为单元格
	value, err := file.GetCellValue("diaomao", "A1")
	if err != nil {
		log.Fatalln("获取单元格值异常: ", err)
	}
	log.Println("A1单元格的值为: ", value)
}

func ChartExcel01() {
	file, err := excelize.OpenFile("test.xlsx")
	if err != nil {
		log.Fatalln("打开文件异常: ", err)
	}
	defer func() {
		err := file.Close()
		if err != nil {
			log.Fatalln("关闭文件异常: ", err)
		}
	}()
	err = file.AddChart("Sheet1", "E1", &excelize.Chart{
		Type: excelize.Col3DClustered,
		Series: []excelize.ChartSeries{
			{
				Name:       "Sheet1!$A$2",
				Categories: "Sheet1!$B$1:$D$1",
				Values:     "Sheet1!$B$2:$D$2",
			},
			{
				Name:       "Sheet1!$A$3",
				Categories: "Sheet1!$B$1:$D$1",
				Values:     "Sheet1!$B$3:$D$3",
			},
			{
				Name:       "Sheet1!$A$4",
				Categories: "Sheet1!$B$1:$D$1",
				Values:     "Sheet1!$B$4:$D$4",
			},
		},
		Title: []excelize.RichTextRun{
			{
				Text: "Fruit 3D Clustered Column Chart",
			},
		},
	})
	if err != nil {
		log.Fatalln("插入图表异常: ", err)
	}
	// 保存文件
	err = file.Save()
	if err != nil {
		log.Fatalln("保存文件异常: ", err)
	}
	log.Println("Chart ok")
}
